﻿using System;

namespace JustMathCore
{
    public unsafe class BitArray
    {
        volatile byte[] mem;
        unsafe byte* memptr;

        BitArray(byte[] data)
        {
            mem = data;
            fixed (byte* pp = mem)
            {
                memptr = pp;
            }
        }
        public static BitArray Create(UInt32 byteSize = 0x20000000)
        {
            var mem = new byte[byteSize];
            return new BitArray(mem);
        }
        public static BitArray FromData(byte[] data)
        {
            return new BitArray(data);
        }
        public byte[] Memory
        {
            get
            {
                return mem;
            }
        }
        public int ByteSize
        {
            get
            {
                return mem.Length;
            }
        }
        public long BitSize
        {
            get
            {
                return mem.LongLength * 8;
            }
        }
        public bool this[UInt32 index]
        {
            get
            {
                UInt32 bytepos = index / 8;
                int bitpos = (int)(index % 8);
                var b = (byte)(1 << bitpos);
                return (memptr[bytepos] & b) > 0;
            }
            set
            {
                UInt32 bytepos = index / 8;
                int bitpos = (int)(index % 8);
                if (value == true)
                {
                    var b = (byte)(1 << bitpos);
                    memptr[bytepos] |= b;
                }
                else
                {
                    var b = (byte)~(1 << bitpos);
                    memptr[bytepos] &= b;
                }
            }
        }
    }
}
